]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
background: fix a race condition when loading several animations
authorJosselin Mouette <joss@debian.org>
Fri, 12 Dec 2014 20:57:11 +0000 (21:57 +0100)
committerMichael Biebl <biebl@debian.org>
Mon, 7 Sep 2015 04:51:42 +0000 (06:51 +0200)
When loading several animations at the same time, the last call
overrides the result for all of them.

This commit caches all animations separately based on the source's
schemas.

https://bugzilla.gnome.org/show_bug.cgi?id=741453

js/ui/background.js

index a4634526c954eaed37a00d2b62caa37fcaa3dc49..e2f9a473b976f4daa55f24bbfa009f26ad26518a 100644 (file)
@@ -144,6 +144,7 @@ const BackgroundCache = new Lang.Class({
         this._pendingFileLoads = [];
         this._fileMonitors = {};
         this._backgroundSources = {};
+        this._animations = {};
     },
 
     monitorFile: function(file) {
@@ -162,12 +163,13 @@ const BackgroundCache = new Lang.Class({
 
     getAnimation: function(params) {
         params = Params.parse(params, { file: null,
+                                        settingsSchema: null,
                                         onLoaded: null });
 
-        if (_fileEqual0(this._animationFile, params.file)) {
+        if (this._animations[params.settingsSchema] && _fileEqual0(this._animationFile, params.file)) {
             if (params.onLoaded) {
                 let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
-                    params.onLoaded(this._animation);
+                    params.onLoaded(this._animations[params.settingsSchema]);
                     return GLib.SOURCE_REMOVE;
                 }));
                 GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
@@ -178,12 +180,11 @@ const BackgroundCache = new Lang.Class({
         let animation = new Animation({ file: params.file });
 
         animation.load(Lang.bind(this, function() {
-                           this._animationFile = params.file;
-                           this._animation = animation;
+                           this._animations[params.settingsSchema] = animation;
 
                            if (params.onLoaded) {
                                let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
-                                   params.onLoaded(this._animation);
+                                   params.onLoaded(this._animations[params.settingsSchema]);
                                    return GLib.SOURCE_REMOVE;
                                }));
                                GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
@@ -403,6 +404,7 @@ const Background = new Lang.Class({
 
     _loadAnimation: function(file) {
         this._cache.getAnimation({ file: file,
+                                   settingsSchema: this._settings.schema_id,
                                    onLoaded: Lang.bind(this, function(animation) {
                                        this._animation = animation;